import axios, {
  AxiosInstance,
  AxiosError,
  AxiosResponse,
  InternalAxiosRequestConfig,
} from 'axios';
import { toast, showFullLoading, hideFullLoading,getBaseURL } from './util';
import { getToken, removeToken } from './auth';
import router from '@/router/route';
import {serverLocation, tokenKey} from "@/util/constants";

// router 不可以直接在router 中引用,会无效,要在创建的实例中使用
const AxiosUtil: AxiosInstance = axios.create({
  baseURL: getBaseURL() + serverLocation,
  timeout: 60000,
});

// 请求拦截器
AxiosUtil.interceptors.request.use(
  function (config: InternalAxiosRequestConfig) {
    showFullLoading();
    const token = getToken();
    if (token) {
      config.headers[tokenKey] = token;
    }
    return config;
  },
  function (error: AxiosError) {
    console.log(error);
    return Promise.reject(error);
  }
);

// 响应拦截器
AxiosUtil.interceptors.response.use(
  function (response: AxiosResponse) {
      // http状态码是2xx的
    // console.log('axios res', response);
      const silent = response.config.silent ?? false;
    hideFullLoading();
    if (response.data.code === 200) {
      // 业务正常返回
      return response.data;
    } else if ( !silent && response.data.code === 500) {
        // 业务异常返回
        toast(response.data.msg, 'error');
    } else if (response.data.code === 555) {
        // 用户token不可用，需要重新登录
        // toast('请重新登录!', 'error');
        removeToken();
        // router.push('/login').then((r) => {});
        router.push('/555').then((r) => {});
    } else {
        // 兜底逻辑，一般用不到
      toast(response.data.msg, 'error');
    }
    return  Promise.reject();
  },
  function (error: AxiosError) {
      // 状态码是2xx以外的
    // http 连接不上,或者其他问题才会走这个错误
    hideFullLoading();
    console.error('axios error', error);
    toast(error.message || '网络错误', 'error');
    return Promise.reject(error);
  }
);

export default AxiosUtil;
